#include <stdio.h>


#define MAXVEX 100 // 图中最大顶点个数
#define INF 32767  // 表示∞

typedef char VertexType[10]; // 定义VertexType为字符串类型

typedef struct vertex {
    int adjvex;      // 顶点编号
    VertexType data; // 顶点的信息
} VType;             // 顶点类型

typedef struct graph {
    int n, e;                  // n为实际顶点数,e为实际边数
    VType vexs[MAXVEX];        // 顶点集合
    int edges[MAXVEX][MAXVEX]; // 边的集合
} MatGraph;                    // 图的邻接矩阵类型

void CreateGraph(MatGraph &g, int n) {
    g.n = n; // 顶点数
    g.e = 0; // 边数
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            g.edges[i][j] = INF; // 初始化邻接矩阵为∞
        }
        g.edges[i][i] = 0; // 对角线元素为0
    }
}

int InsertEdge2(MatGraph &g, int u, int v, int w) { // 有向图插入边
    if (u < 0 || u >= g.n || v < 0 || v >= g.n)
        return 0; // 顶点编号错误返回0
    g.edges[u][v] = w;
    g.e++;
    return 1;
}

int main() {
    //输入 n, e
    int n, e;
    scanf("%d %d", &n, &e);

    // 创建图
    MatGraph g;
    // 初始化 图
    CreateGraph(g, n);
    // 输入边
    for (int i = 0; i < e; i++) {
        int u, v, w;
        scanf("%d %d %d", &u, &v, &w);
        InsertEdge2(g, u, v, w);
    }
    // 输出邻接矩阵
    DispMatGraph(g);
    // 输出邻接表
    DispAdjGraph(g);

    return 0;
}